package ar.edu.utn.frba.dds.tp.segundaEntrega.code.adapter;


import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

import ar.edu.utn.frba.dds.tp.segundaEntrega.code.Aerolinea;
import ar.edu.utn.frba.dds.tp.segundaEntrega.code.AsientoDeVuelo;
import ar.edu.utn.frba.dds.tp.segundaEntrega.code.Busqueda;
import ar.edu.utn.frba.dds.tp.segundaEntrega.code.Vuelo;

import com.google.common.base.Predicate;
import com.google.common.collect.Iterables;
import com.lanchita.AerolineaLanchita;

/**
 * @author Lucas
 */

public class LanchitaAdapter extends Aerolinea{
	
	private AerolineaLanchita aerolineaLanchita = AerolineaLanchita.getInstance();
	private Conversor conversor = new Conversor();
	private BigDecimal impuesto = new BigDecimal (0.15);
	
	
	@Override
	public BigDecimal getImpuesto(){
		return this.impuesto;
	}
	
	@Override
	public void comprarAsiento(AsientoDeVuelo asiento) {
		String codigo = conversor.convertirAString(asiento);
		aerolineaLanchita.comprar(codigo);
	}

	@Override
	public List<Vuelo> vuelosDisponibles(Busqueda busqueda) {
		
		List<Vuelo> vuelos = new ArrayList<Vuelo>();
		

		String[] busquedaParseada = conversor.parsearBusqueda(busqueda);
		
		String[][] asientosDisponibles = aerolineaLanchita.asientosDisponibles(
				busquedaParseada[0],
				busquedaParseada[1],
				busquedaParseada[2],
				busquedaParseada[3],
				busquedaParseada[4],
				busquedaParseada[5]);
		
		
		for(String[] asientoEnString: asientosDisponibles){
			ponerEnVuelo(conversor.convertirAsiento(asientoEnString), vuelos);
		}
		return vuelos;
	}
	

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime
				* result
				+ ((aerolineaLanchita == null) ? 0 : aerolineaLanchita
						.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		LanchitaAdapter other = (LanchitaAdapter) obj;
		return this.getClass().equals(other.getClass());
		
	}

	private void ponerEnVuelo(final AsientoDeVuelo asiento, List<Vuelo> vuelos) {
		//el predicado para el find
		Predicate<Vuelo> predicate = new Predicate<Vuelo>() {

			@Override
			public boolean apply(Vuelo vuelo) {
				return vuelo.getNroDeVuelo().equals(asiento.getCodigoDeVuelo());
			}
		};
		
		//find devuelve el vuelo que cumpla con la condición del apply o un vuelo nuevo con el número de asiento del asiento
		Vuelo vuelo = Iterables.find(vuelos, predicate, asiento.getVuelo() ) ;
		vuelo.setAerolinea(this);
		vuelo.agregarAsiento(asiento);
		agregarVueloSiCorresponde(vuelo, vuelos);
	}

	private void agregarVueloSiCorresponde(Vuelo vuelo, List<Vuelo> vuelos) {
		if (!vuelos.contains(vuelo))vuelos.add(vuelo);
	}


}
